Go言語(golang)でGoogle Cloud Storageからファイルを取得する
データアナリティクス事業本部の森脇です。
今回はGoogle CLoud Storageからファイルを取得する方法についてご紹介したいと思います。
使用するGo言語のバージョンは1.13.6です。
sdkをインストールする
cloud.google.com/go/storage を使用します。
$ go mod init example.com/gcs/read go: creating new go.mod: module example.com/gcs/read $ go get -u cloud.google.com/go/storage . . . $ cat go.mod $ cat go.mod module example.com/gcs/read go 1.13 require ( cloud.google.com/go v0.53.0 // indirect golang.org/x/exp v0.0.0-20200213203834-85f925bdd4d0 // indirect golang.org/x/sys v0.0.0-20200217220822-9197077df867 // indirect golang.org/x/tools v0.0.0-20200219054238-753a1d49df85 // indirect google.golang.org/genproto v0.0.0-20200218151345-dad8c97a84f5 // indirect )
v0.53.0がインストールされました
作っていく
main.goというファイルを作成し、実装していきます。
予めお目当てのGCSバケットに接続できるサービスアカウントを発行し、jsonファイルをダウンロードしておきます。 今回はmain.goと同じフォルダに、「key.json」という名前で保存しておきました。
package main import ( "bufio" "context" "io" "log" "os" "cloud.google.com/go/storage" "google.golang.org/api/option" ) func main() { credentialFilePath := "./key.json" // クライアントを作成する ctx := context.Background() client, err := storage.NewClient(ctx, option.WithCredentialsFile(credentialFilePath)) if err != nil { log.Fatal(err) } // GCSオブジェクトを書き込むファイルの作成 f, err := os.Create("sample.txt") if err != nil { log.Fatal(err) } // オブジェクトのReaderを作成 bucketName := "xxx-bucket" objectPath := "yyy-obj" obj := client.Bucket(bucketName).Object(objectPath) reader, err := obj.NewReader(ctx) if err != nil { log.Fatal(err) } defer reader.Close() // 書き込み tee := io.TeeReader(reader, f) s := bufio.NewScanner(tee) for s.Scan() { } if err := s.Err(); err != nil { log.Fatal(err) } log.Println("done") }
実行してみます。
$ go run main.go 2020/02/19 16:27:07 done
成功し、sample.txtにはGCSのファイルが書き込まれていました。
まとめ
「cloud.google.com/go/storage」を使うことで、簡単にGCSからファイルを取得することができました。 また、contextを引数で渡せるので中断処理も簡単に行えそうです。